/*
 *  thread.h, Copyright (c) 2016, mogujie.com
 *  All rights reserved
 *
 *  Created on: 2016年2月28日
 *      Author: yongxue@mogujie.com
 */

#ifndef THREAD_THREAD_H_
#define THREAD_THREAD_H_

#include "base/base.h"
#include "exception/util.h"
#include "thread/lock_util.h"
#include "thread/thread_lock.h"


namespace thread {

class ThreadException: public except_util::Exception {
	public:
		ThreadException(IN const string& msg): Exception(msg) {};

		ThreadException(IN const string& msg, int code);
		~ThreadException() = default;
};


/**
 * thread控制和thread类也可以放在同一个类中，暂时先放在一起
 */
/**
 * thread控制
 */
class ThreadCtl {
	public:
		/**
		 * 构造，根据当前线程创建一个控制器
		 */
		ThreadCtl(): m_tid(pthread_self()) {};

		/**
		 * 构造，根据指定的tid创建一个控制器
		 */
		explicit ThreadCtl(IN pthread_t tid): m_tid(tid) {};

		/**
		 * 设置等待该控制器的线程结束。自己不能等待自己结束
		 */
		void join();

		/**
		 * 等待
		 */
		void detach();

		/**
		 * 获取线程的tid
		 */
		pthread_t tid() const { return m_tid; }

		/**
		 * 设置休息
		 */
		static void sleep(IN long millsecond);

		/**
		 * 交出当前线程的控制权
		 */
		static void yield();

	private:
		pthread_t		m_tid;
};


/**
 * thread类
 */
class Thread {
	public:
		/**
		 * 构造函数
		 */
		Thread(): m_running(false), m_tid(0) {}
		virtual ~Thread() = default;

		/**
		 * 启动线程，线程启动之后得到一个控制器
		 */
		ThreadCtl start();

		/**
		 * 得到thread id
		 */
		pthread_t tid() const { return m_tid; }

	protected:
		/**
		 * 静态函数，线程的入口
		 * @param		入参为：Thread对象，this指针
		 */
		static void threadEntry(IN void* ptr_void);

		/**
		 * 实际运行的task
		 */
		virtual void runTask() = 0;

		/**
		 * 判断是否存在
		 */
		bool isAlive() const { return m_running; }

	protected:
		bool 		m_running;
		pthread_t	m_tid;

		typedef lock::CondMutex<lock::Mutex, lock::Cond> ThreadLock;
		ThreadLock	m_lock;
};

}


#endif /* THREAD_THREAD_H_ */
